package com.example.Exception;

import java.text.ParseException;
import java.text.SimpleDateFormat;

public class exception {
    public static void main(String[] args) throws ParseException {
        //JVM();
        //method1();  //此时调用者也没有处理,还是会交给虚拟机处理，
        //method2(); //还是继续交给调用者处理,而main方法的调用者是虚拟机,还是会采取虚拟机默认处理异常的方法
        //Throw();
        /* //int[] arr = {1, 2, 3, 4, 5};
        int[] arr = null;
        printArr(arr);//就会 接收到一个异常
        // 我们还需要自己处理一下异常
        */


        int[] arr = null;
        try{
            //有可能发现异常的代码
            printArr(arr);
        }catch (NullPointerException e){
            //如果出现了这样的异常,那么我们进行的操作
            System.out.println("参数不能为null");
        }
        System.out.println("嘿嘿嘿");  //嘿嘿嘿
    }

    private static void printArr(int[] arr) {
        //调用者知道成功打印了吗?
        if (arr == null) {
            //System.out.println("参数不能为null");
            throw new NullPointerException();//当参数为null的时候18
            // 手动创建了一个异常对象,抛给了调用者
        } else {
            for (int i = 0; i < arr.length; i++) {
                System.out.println(arr[i]);
            }
        }
    }

    private static void Throw() {
        System.out.println("123");
        throw new RuntimeException();//当代码执行到这里,就创建一个异常对象
        // 该异常创建之后,暂时没有手动处理,抛给了调用者处理
        // 下面的代码不会再执行了
        //System.out.println("456");
    }

    //告诉调用者,你调用我,有可能会出现这样的异常哦，
    //如果方法中没有出现异常,那么正常执行
    //如果方法中真的出现了异常,其实也是将这个异常交给了调用者处理
    //如果声明的异常是一个编译时异常,那么声明的代码必须要手动写出
    private static void method2() throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        sdf.parse("2024-8-11");
    }

    //告诉调用者,你调用我,有可能会出现这样的异常哦，
    //如果方法中没有出现异常,那么正常执行
    //如果方法中真的出现了异常,其实也是将这个异常交给了调用者处理
    //如果声明的异常是一个运行时异常,那么声明的代码可以省略
    private static void method1() /*throws NullPointerException*/ {
        int[] arr = null;
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }

    private static void JVM() {
        int[] arr = {1, 2, 3, 4, 5};
        System.out.println(arr[10]);//当代码出现了异常，那么就在这里创建了一个异常对象
        //new ArrayIndexOutOfBoundsException();
        //首先会看程序中有没有自己处理异常的代码
        //如果没有，交给本方法的调用者处理
        //最终这个异常会交给虚拟机默认处理
        //JVM默认处理异常做了那几件事
        //1,将异常信息以红色字体展示在控制台上
        //2,停止程序运行，---哪里出现了异常,那么程序就在哪里停止,下面的代码就不执行了

        System.out.println("hhhhhhh");
    }
}
